package com.example.handler;

import cn.dev33.satoken.stp.StpUtil;
import com.example.mapper.UserMapper;
import com.example.model.FraudRiskResult;
import com.example.model.pojo.Person;
import com.example.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 身份冒用风险处理器
 * 处理身份冒用类型的风险
 * 
 * @author system
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class IdentityTheftRiskHandler implements RiskHandler {

  private final UserService userService;
  private final UserMapper userMapper;

  @Override
  public boolean canHandle(FraudRiskResult result) {
    return result.getRiskType() == 1; // 身份冒用类型
  }

  @Override
  public void handle(FraudRiskResult result) {
    if (!canHandle(result)) {
      return;
    }

    log.info("处理身份冒用风险，用户地址：{}，风险评分：{}", result.getUserAddress(), result.getScore());

    // 根据风险等级采取不同措施
    switch (result.getRiskLevel()) {
      case 2: // 高风险
        // 立即冻结账户
        Person highRiskPerson = userMapper.getPersonByAddress(result.getUserAddress());
        StpUtil.disable(highRiskPerson.getId(), -1);

        log.warn("发现高风险身份冒用行为，已冻结账户，用户地址：{}", result.getUserAddress());
        break;
      case 1: // 中风险
        // 要求用户进行身份重新验证（踢下线，并提醒）
        boolean isSuccess = userService.requireReVerification(result.getUserAddress());
        if (isSuccess) {
          log.warn("发现中风险身份冒用行为，已踢下线，用户地址：{}", result.getUserAddress());
        } else {
          log.warn("发现中风险身份冒用行为，踢下线失败，用户地址：{}", result.getUserAddress());
        }
        log.warn("发现中风险身份冒用行为，已要求重新验证，用户地址：{}", result.getUserAddress());
        break;
      case 0: // 低风险
        // 记录日志，增加监控频率
        log.info("发现低风险身份冒用行为，增加监控频率，用户地址：{}", result.getUserAddress());
        break;
      default:
        log.info("未知风险等级，用户地址：{}", result.getUserAddress());
    }
  }

  @Override
  public int getOrder() {
    return 10; // 风险类型处理器优先级低于风险等级处理器
  }
}